{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### CIFAR-10问题描述\n",
    "由于照片中对象，位置，照明等排列几乎有无限数量，很难对照片进行自动分类。这是一个非常困难的问题。\n",
    "\n",
    "然而，这也是计算机视觉中一个经过充分研究的问题，并且是最近深度学习能力的重要证明。加拿大高级研究所（CIFAR）开发了针对此问题的标准计算机视觉和深度学习数据集。\n",
    "\n",
    "所述CIFAR-10数据集包括60000张照片分成10类（故名CIFAR-10）。类包括常见的对象，例如飞机，汽车，鸟类，猫等。以标准方式拆分数据集，其中将50,000张图像用于训练模型，其余10,000张用于评估其性能。\n",
    "\n",
    "这些照片的颜色带有红色，绿色和蓝色成分，但是尺寸很小，只有32 x 32像素正方形。\n",
    "\n",
    "使用非常大的卷积神经网络可以实现最新的结果。您可以在Rodrigo Benenson的网页上的CIFAR-10上了解结果的状态。报告的模型性能以分类准确度表示，在撰写本文时，人类在该问题上的表现为94％，而最先进的结果为96％，具有90％以上的非常好表现。\n",
    "\n",
    "有一个使用CIFAR-10数据集的Kaggle竞赛，可以讨论开发新模型以解决问题，并且是挑选模型和脚本的好地方。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 在Keras中加载CIFAR-10数据集\n",
    "CIFAR-10数据集可以轻松地加载到Keras中。\n",
    "\n",
    "Keras可以自动下载标准数据集（如CIFAR-10），并使用cifar10.load_data（）函数将其存储在〜/ .keras / datasets目录中。该数据集很大，为163兆字节，因此下载可能需要几分钟。\n",
    "\n",
    "下载后，对该函数的后续调用将加载数据集以供使用。\n",
    "\n",
    "数据集存储为训练和测试集，可以在Keras中使用。每个图像都表示为数值矩阵，我们可以使用matplotlib直接绘制图像。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 9 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot ad hoc CIFAR10 instances\n",
    "from keras.datasets import cifar10\n",
    "from matplotlib import pyplot\n",
    "# load data\n",
    "(X_train, y_train), (X_test, y_test) = cifar10.load_data()\n",
    "# create a grid of 3x3 images\n",
    "for i in range(0, 9):\n",
    "\tpyplot.subplot(330 + 1 + i)\n",
    "\tpyplot.imshow(X_train[i])\n",
    "# show the plot\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 用于CIFAR-10的简单卷积神经网络\n",
    "使用卷积神经网络（CNN）可以最好地解决CIFAR-10问题。\n",
    "\n",
    "我们可以通过定义此示例中需要的所有类和函数来快速开始。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Simple CNN model for the CIFAR-10 Dataset\n",
    "from keras.datasets import cifar10\n",
    "from keras.models import Sequential\n",
    "from keras.layers import Dense\n",
    "from keras.layers import Dropout\n",
    "from keras.layers import Flatten\n",
    "from keras.constraints import maxnorm\n",
    "from keras.optimizers import SGD\n",
    "from keras.layers.convolutional import Conv2D\n",
    "from keras.layers.convolutional import MaxPooling2D\n",
    "from keras.utils import np_utils"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "(X_train, y_train), (X_test, y_test) = cifar10.load_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train shape: (50000, 32, 32, 3)\n",
      "50000 train samples\n",
      "10000 test samples\n"
     ]
    }
   ],
   "source": [
    "print('X_train shape:', X_train.shape)\n",
    "print(X_train.shape[0], 'train samples')\n",
    "print(X_test.shape[0], 'test samples')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于红色，绿色和蓝色通道中的每个通道，像素值都在0到255的范围内。\n",
    "\n",
    "比较好的做法是使用归一化数据。因为输入值很容易理解，所以我们可以通过将每个值除以最大观察值255来轻松地将范围归一化为0到1。\n",
    "\n",
    "注意，数据是作为整数加载的，因此我们必须将其强制转换为浮点值才能执行除法。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# normalize inputs from 0-255 to 0.0-1.0\n",
    "X_train = X_train.astype('float32')\n",
    "X_test = X_test.astype('float32')\n",
    "X_train = X_train / 255.0\n",
    "X_test = X_test / 255.0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以使用编码将它们转换为二进制矩阵，以便对分类问题进行最佳建模。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# one hot encode outputs\n",
    "y_train = np_utils.to_categorical(y_train)\n",
    "y_test = np_utils.to_categorical(y_test)\n",
    "num_classes = y_test.shape[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_classes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面用keras建立卷积神经网络模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create the model\n",
    "model = Sequential()\n",
    "model.add(Conv2D(32, (3, 3), input_shape=(32, 32, 3), padding='same', activation='relu', kernel_constraint=maxnorm(3)))\n",
    "model.add(Dropout(0.2))\n",
    "model.add(Conv2D(32, (3, 3), activation='relu', padding='same', kernel_constraint=maxnorm(3)))\n",
    "model.add(MaxPooling2D())\n",
    "model.add(Flatten())\n",
    "model.add(Dense(512, activation='relu', kernel_constraint=maxnorm(3)))\n",
    "model.add(Dropout(0.5))\n",
    "model.add(Dense(num_classes, activation='softmax'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "编译模型，设置训练参数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d_1 (Conv2D)            (None, 32, 32, 32)        896       \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 32, 32, 32)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_2 (Conv2D)            (None, 32, 32, 32)        9248      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 16, 16, 32)        0         \n",
      "_________________________________________________________________\n",
      "flatten_1 (Flatten)          (None, 8192)              0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 512)               4194816   \n",
      "_________________________________________________________________\n",
      "dropout_2 (Dropout)          (None, 512)               0         \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 10)                5130      \n",
      "=================================================================\n",
      "Total params: 4,210,090\n",
      "Trainable params: 4,210,090\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "# Compile model\n",
    "epochs = 25\n",
    "lrate = 0.01\n",
    "decay = lrate/epochs\n",
    "sgd = SGD(lr=lrate, momentum=0.9, decay=decay, nesterov=False)\n",
    "model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 50000 samples, validate on 10000 samples\n",
      "Epoch 1/25\n",
      "50000/50000 [==============================] - 291s 6ms/step - loss: 1.6923 - acc: 0.3853 - val_loss: 1.3945 - val_acc: 0.5120\n",
      "Epoch 2/25\n",
      " 3360/50000 [=>............................] - ETA: 4:30 - loss: 1.3816 - acc: 0.4955"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-22-abb3aae252ff>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;31m# Fit the model\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalidation_data\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_test\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_test\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mepochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mepochs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m32\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m~/anaconda2/envs/ipykernel_py3/lib/python3.6/site-packages/keras/models.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)\u001b[0m\n\u001b[1;32m    961\u001b[0m                               \u001b[0minitial_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minitial_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    962\u001b[0m                               \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 963\u001b[0;31m                               validation_steps=validation_steps)\n\u001b[0m\u001b[1;32m    964\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    965\u001b[0m     def evaluate(self, x=None, y=None,\n",
      "\u001b[0;32m~/anaconda2/envs/ipykernel_py3/lib/python3.6/site-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)\u001b[0m\n\u001b[1;32m   1703\u001b[0m                               \u001b[0minitial_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minitial_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1704\u001b[0m                               \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1705\u001b[0;31m                               validation_steps=validation_steps)\n\u001b[0m\u001b[1;32m   1706\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1707\u001b[0m     def evaluate(self, x=None, y=None,\n",
      "\u001b[0;32m~/anaconda2/envs/ipykernel_py3/lib/python3.6/site-packages/keras/engine/training.py\u001b[0m in \u001b[0;36m_fit_loop\u001b[0;34m(self, f, ins, out_labels, batch_size, epochs, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch, steps_per_epoch, validation_steps)\u001b[0m\n\u001b[1;32m   1233\u001b[0m                         \u001b[0mins_batch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mins_batch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtoarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1234\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1235\u001b[0;31m                     \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mins_batch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1236\u001b[0m                     \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1237\u001b[0m                         \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda2/envs/ipykernel_py3/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m   2476\u001b[0m         \u001b[0msession\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_session\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2477\u001b[0m         updated = session.run(fetches=fetches, feed_dict=feed_dict,\n\u001b[0;32m-> 2478\u001b[0;31m                               **self.session_kwargs)\n\u001b[0m\u001b[1;32m   2479\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mupdated\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2480\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda2/envs/ipykernel_py3/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m    893\u001b[0m     \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    894\u001b[0m       result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[0;32m--> 895\u001b[0;31m                          run_metadata_ptr)\n\u001b[0m\u001b[1;32m    896\u001b[0m       \u001b[0;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    897\u001b[0m         \u001b[0mproto_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda2/envs/ipykernel_py3/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run\u001b[0;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m   1126\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mfinal_fetches\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mfinal_targets\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mhandle\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mfeed_dict_tensor\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1127\u001b[0m       results = self._do_run(handle, final_targets, final_fetches,\n\u001b[0;32m-> 1128\u001b[0;31m                              feed_dict_tensor, options, run_metadata)\n\u001b[0m\u001b[1;32m   1129\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1130\u001b[0m       \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda2/envs/ipykernel_py3/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_run\u001b[0;34m(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m   1342\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mhandle\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1343\u001b[0m       return self._do_call(_run_fn, self._session, feeds, fetches, targets,\n\u001b[0;32m-> 1344\u001b[0;31m                            options, run_metadata)\n\u001b[0m\u001b[1;32m   1345\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1346\u001b[0m       \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_prun_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeeds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetches\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda2/envs/ipykernel_py3/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_call\u001b[0;34m(self, fn, *args)\u001b[0m\n\u001b[1;32m   1348\u001b[0m   \u001b[0;32mdef\u001b[0m \u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1349\u001b[0m     \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1350\u001b[0;31m       \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1351\u001b[0m     \u001b[0;32mexcept\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOpError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1352\u001b[0m       \u001b[0mmessage\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_text\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmessage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda2/envs/ipykernel_py3/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run_fn\u001b[0;34m(session, feed_dict, fetch_list, target_list, options, run_metadata)\u001b[0m\n\u001b[1;32m   1327\u001b[0m           return tf_session.TF_Run(session, options,\n\u001b[1;32m   1328\u001b[0m                                    \u001b[0mfeed_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtarget_list\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1329\u001b[0;31m                                    status, run_metadata)\n\u001b[0m\u001b[1;32m   1330\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1331\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m_prun_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "# Fit the model\n",
    "model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 50.87%\n"
     ]
    }
   ],
   "source": [
    "# Final evaluation of the model\n",
    "scores = model.evaluate(X_test, y_test, verbose=0)\n",
    "print(\"Accuracy: %.2f%%\" % (scores[1]*100))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 后续扩展\n",
    "以下是一些可以尝试扩展模型并改善模型性能的想法。\n",
    "\n",
    "- 训练更长的时间。训练大型卷积神经网络用于数百或数千个周期是很常见的。\n",
    "- 图像数据增强。图像中的对象的位置不同。通过使用某些数据扩充，可以进一步提高模型性能。诸如标准化和随机位移以及水平图像翻转之类的方法可能是有益的。\n",
    "- 更深层的网络拓扑。可以为该问题设计更大的神经网络，并可以调整神经网络中的各类参数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
